{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.parser.add_argument()命令行参数解析包，可以频繁的修改参数\n",
    "#### 2.assert断言\n",
    "#### 3.autocast自动混合精度\n",
    "#### [4.split()](#4)\n",
    "#### 5.Counter（）统计词频\n",
    "#### 6.if语句群魔乱舞\n",
    "#### 7.random.seed()随机种子的作用\n",
    "#### [8.字典的key方法](#8)\n",
    "#### 9.y_pred = (y_pred > 0.5).long().data.numpy().astype(np.int32)\n",
    "#### 10.手动求解梯度和计算机求解梯度的区别\n",
    "#### 11.torch.linspace(start, end, steps)按照等步长切分\n",
    "#### [12.维度的理解，对维度进行操作](#12)\n",
    "#### 13.torch.normal(mean, std, out=None)返回一个张量，张量的每个值符合正态分布\n",
    "#### 14.torch.eq(input, other)比较元素是否相等\n",
    "#### 14.1.torch.equal(tensor1, tensor2, out=None)比较两个张量是否相等，包含元素和形状\n",
    "#### 15.torch.mean(input, dim, keepdim=False)当keepdim=True时输入维度等于输出维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.cuda.amp import autocast,GradScaler\n",
    "import torch\n",
    "from torch.autograd import Variable\n",
    "import numpy as np\n",
    "from collections import Counter# 统计词频\n",
    "import random\n",
    "from matplotlib import pyplot as plt\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.parser.add_argument()命令行参数解析包，可以频繁的修改参数\n",
    "* name or flags  - 必选参数名或者可选参数标识符，它必须作为add_argument()方法的第一个参数。\n",
    "* dest- 这个参数相当于把位置参数或者选项参数关联到一个特定的名字\n",
    "* action- 表示值赋予键的方式，这里用到的是bool类型，action意思是当读取的参数中出现指定参数的时候的行为,调用时只需要传入name即可\n",
    "* help       - 参数的说明信息\n",
    "* required    - 说明参数是否必须进行输入，只支持可选参数。\n",
    "* type      - 指定命令行参数数据类型\n",
    "* choices    - 说明命令行参数的取值范围，它的值一般是一个列表。choices列表中元素的类型应该与type批定的类型相兼容\n",
    "* default   - 必选参数和可选的参数的默认值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Namespace(dataset_tag='ace2005', lr=2e-05, max_len=512, not_save=False, train_batch=10)\n",
      "====================万能的分隔符====================\n",
      "args.dataset_tag:  ace2005\n",
      "args.train_batch:  10\n"
     ]
    }
   ],
   "source": [
    "import argparse\n",
    "\n",
    "# 创建一个解析器 \n",
    "parser = argparse.ArgumentParser(description=\"argparse库的应用\")\n",
    "# 添加参数\n",
    "parser.add_argument(\"--dataset_tag\", default='ace2005', choices=['ace2005', 'ace2004'])\n",
    "parser.add_argument(\"--train_batch\", type=int, default=10)\n",
    "parser.add_argument(\"--max_len\", default=512, type=int, help=\"maximum length of input\")\n",
    "parser.add_argument(\"--lr\", type=float, default=2e-5)\n",
    "parser.add_argument(\"--not_save\", action=\"store_true\", help=\"whether to save the model\")\n",
    "\n",
    "# 拿到args，从命令行中传值即可。\n",
    "args = parser.parse_args(args=[])# 加入args=[]才能运行，jupyter的特点\n",
    "'''\n",
    "保存运行的结果\n",
    "python model.py --dataset_tag ace2004 --train_batch 30 --max_len 320 --not_save\n",
    "不保存结果\n",
    "python model.py --dataset_tag ace2004 --train_batch 30 --max_len 320 \n",
    "'''\n",
    "\n",
    "print(args)\n",
    "# 执行函数的返回值为argumentParser的格式，获取值应用parse_args函数\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "print(\"args.dataset_tag: \",args.dataset_tag)\n",
    "print(\"args.train_batch: \",args.train_batch)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.assert断言\n",
    "在测试用例中，执行完测试用例后，最后一步是判断测试结果是pass还是fail，自动化测试脚本里面一般把这种生成测试结果的方法称为断言（assert）\n",
    "\n",
    "* 在没完善一个程序之前，我们不知道程序在哪里会出错，与其让它在运行时崩溃，不如在出现错误条件时就崩溃"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "asert 2 > 1断言成立，可以执行下面的分隔符程序\n",
      "====================万能的分隔符====================\n"
     ]
    },
    {
     "ename": "AssertionError",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAssertionError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-3-f7a28f7ab9a0>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"asert 2 > 1断言成立，可以执行下面的分隔符程序\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m\"万能的分隔符\"\u001b[0m\u001b[1;33m+\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32massert\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"asert 1 > 2断言不成立，不可以执行下面的分隔符程序\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m\"万能的分隔符\"\u001b[0m\u001b[1;33m+\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;34m\"=\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mAssertionError\u001b[0m: "
     ]
    }
   ],
   "source": [
    "assert 2 > 1\n",
    "print(\"asert 2 > 1断言成立，可以执行下面的分隔符程序\")\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "assert 1 > 2\n",
    "print(\"asert 1 > 2断言不成立，不可以执行下面的分隔符程序\")\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.autocast自动混合精度\n",
    "### 在PyTorch中，一共有10种类型的tensor：\n",
    "* torch.FloatTensor (32-bit floating point)\n",
    "* torch.DoubleTensor (64-bit floating point)\n",
    "* torch.HalfTensor (16-bit floating point 1)\n",
    "* torch.BFloat16Tensor (16-bit floating point 2)\n",
    "* torch.ByteTensor (8-bit integer (unsigned))\n",
    "* torch.CharTensor (8-bit integer (signed))\n",
    "* torch.ShortTensor (16-bit integer (signed))\n",
    "* torch.IntTensor (32-bit integer (signed))\n",
    "* torch.LongTensor (64-bit integer (signed))\n",
    "* torch.BoolTensor (Boolean)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a:\n",
      " tensor([[0.3138, 0.4131, 0.7253],\n",
      "        [0.9798, 0.9411, 0.3547]])\n",
      "a.shape:  torch.Size([2, 3])\n",
      "a.dtype:  torch.float32\n",
      "a_1.dtype:  torch.int64\n",
      "b.dtype:  torch.float64\n",
      "====================万能的分隔符====================\n",
      "tensor([[0.0675, 0.0430, 0.0841],\n",
      "        [0.9595, 0.3167, 0.2204]], dtype=torch.float64)\n",
      "torch.float64\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\torch\\autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n"
     ]
    }
   ],
   "source": [
    "a = torch.rand(2, 3)# float32\n",
    "a_1 = torch.tensor([1, 2])\n",
    "print(\"a:\\n\", a)\n",
    "print(\"a.shape: \", a.shape)\n",
    "print(\"a.dtype: \", a.dtype)\n",
    "print(\"a_1.dtype: \", a_1.dtype)\n",
    "\n",
    "b = torch.rand(2, 3).double()# float64\n",
    "print(\"b.dtype: \", b.dtype)\n",
    "\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "with autocast():\n",
    "    result = torch.mul(a, b)# mul对位相乘\n",
    "    print(result)\n",
    "    print(result.dtype)# float 64"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=4>4.split()</span>\n",
    "## 通过指定分隔符对字符串进行切分\n",
    "* str.split(str=\"\", num=string.count(str))\n",
    "    * str-分隔符，默认为空字符切分，也可以使用换行、空格、制表符\n",
    "    * num-分割的次数，默认为-1，即分割所有\n",
    "        * **拆分1次分为两块，拆分2次分为三块**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Line1-abcdef', 'Line2-abc', 'Line4-abcd']\n",
      "====================万能的分隔符====================\n",
      "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd']\n",
      "====================万能的分隔符====================\n",
      "['Line1-abcdef', 'Line2-abc', 'Line4-abcd', 'Line1-abcdef', 'Line2-abc', 'Line4-abcd']\n",
      "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd Line1-abcdef \\nLine2-abc \\nLine4-abcd']\n",
      "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd Line1-abcdef ', 'Line2-abc \\nLine4-abcd']\n"
     ]
    }
   ],
   "source": [
    "str = \"Line1-abcdef \\nLine2-abc \\nLine4-abcd\";\n",
    "\n",
    "print(str.split())\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "print(str.split('\\n', 2))\n",
    "\n",
    "'''\n",
    "['Line1-abcdef', 'Line2-abc', 'Line4-abcd']     以空格进行拆分\n",
    "['Line1-abcdef ', 'Line2-abc ', 'Line4-abcd']   以\\n进行拆分，因此拆分两次，中间还有空格.  \n",
    "'''\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "str = \"Line1-abcdef \\nLine2-abc \\nLine4-abcd Line1-abcdef \\nLine2-abc \\nLine4-abcd\";\n",
    "\n",
    "print(str.split())\n",
    "print(str.split('\\n', 2))\n",
    "print(str.split('\\n', 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5.Counter（）统计词频\n",
    "## 使用实例化的对象dict[key]+=1统计的词频\n",
    "## return：dict\n",
    "***\n",
    "**[字典的get方法](#8)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'red': 2, 'blue': 3, 'green': 1}\n"
     ]
    }
   ],
   "source": [
    "'''传统方式统计词频'''\n",
    "#red:2  , blue:3 , green:1\n",
    "colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']\n",
    "result = {}\n",
    "for color in colors:\n",
    "    if result.get(color) == None:# 字典的get方法，如果没有相应的key, 则把key加入到字典，若有了，则进行其他操作，一般是把对应的value设置成列表，依次加入\n",
    "        result[color] = 1\n",
    "    else:\n",
    "        result[color] += 1\n",
    "print (result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({'blue': 3, 'red': 2, 'green': 1})\n",
      "<class 'collections.Counter'>\n",
      "{'red': 2, 'blue': 3, 'green': 1}\n"
     ]
    }
   ],
   "source": [
    "colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']\n",
    "c = Counter(colors)\n",
    "print (c)\n",
    "print(type(c))\n",
    "print(dict(c))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用时一般是实例化一个对象进行调用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({'blue': 3, 'red': 2, 'green': 1})\n",
      "{'red': 2, 'blue': 3, 'green': 1}\n"
     ]
    }
   ],
   "source": [
    "colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']\n",
    "counter = Counter()\n",
    "for color in colors:\n",
    "    counter[color] += 1\n",
    "print(counter)\n",
    "print(dict(counter))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6.if语句群魔乱舞"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "if x is True\n",
      "if x is True === if not x is None\n",
      "if x is True === if x is True === if not (x is None)\n"
     ]
    }
   ],
   "source": [
    "x = True\n",
    "\n",
    "if x is True:\n",
    "    print(\"if x is True\")\n",
    "\n",
    "if not x is None:\n",
    "    print(\"if x is True === if not x is None\")\n",
    "\n",
    "if not (x is None):\n",
    "    print('if x is True === if x is True === if not (x is None)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(1, 'keu'), (2, 'key'), (3, 'vlue')]\n",
      "[]\n",
      "[(1, 'keu'), (2, 'key'), (3, 'vlue')]\n"
     ]
    }
   ],
   "source": [
    "dict1 = {1:\"keu\", 2:\"key\", 3:\"vlue\"}\n",
    "\n",
    "x = [(n,p) for n, p in dict1.items()]\n",
    "y = [(n,p) for n, p in dict1.items() if  p is None]\n",
    "z = [(n,p) for n, p in dict1.items() if not p is None]\n",
    "\n",
    "print(x)\n",
    "print(y)\n",
    "print(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7.random随机种子的作用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.3786334232068297\n",
      "0.6377630428340777\n",
      "0.4910705810343935\n",
      "====================万能的分隔符====================\n",
      "0.2021286936567015\n",
      "0.581385178722511\n",
      "0.25583209986437083\n",
      "====================万能的分隔符====================\n",
      "0.13436424411240122\n",
      "0.8474337369372327\n",
      "0.763774618976614\n",
      "====================万能的分隔符====================\n",
      "0.13436424411240122\n",
      "0.8474337369372327\n",
      "0.763774618976614\n",
      "====================万能的分隔符====================\n"
     ]
    }
   ],
   "source": [
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "# 指定随机种子,可以让每一次生成的随机数固定\n",
    "random.seed(1)\n",
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "random.seed(1)\n",
    "for _ in range(3):\n",
    "    a = random.random()\n",
    "    print(a)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=8>8.字典的get方法</span>\n",
    "\n",
    "### dict.get(key, default=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Value : 27\n",
      "Value : None\n",
      "Value : Not Available\n",
      "{'Name': 'Runoob', 'Age': 27}\n"
     ]
    }
   ],
   "source": [
    "dict = {'Name': 'Runoob', 'Age': 27}\n",
    "'''key在字典中，返回对应的value，不在字典中，默认返回None，否则返回指定的值'''\n",
    "print(\"Value : %s\" %  dict.get('Age'))# key在字典中，返回对应的value\n",
    "print(\"Value : %s\" %  dict.get('Sex')) # 不在字典中，默认返回None\n",
    "print(\"Value : %s\" %  dict.get('Sex', \"Not Available\")) # 返回指定的值 \"Not Available\"\n",
    "print(dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 把一个字典的value(数字列表)转化为一个tensor格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'batch_1_context': [tensor([1, 2, 3, 4, 5])], 'batch_1_answer': [tensor([61, 62, 63, 64, 65])]}\n",
      "====================万能的分隔符====================\n",
      "k:  batch_1_context\n",
      "v:  [tensor([1, 2, 3, 4, 5])]\n",
      "type(v): <class 'list'>\n",
      "v[0]:  tensor([1, 2, 3, 4, 5])\n",
      "type(v[0]): <class 'torch.Tensor'>\n",
      "====================万能的分隔符====================\n",
      "k:  batch_1_answer\n",
      "v:  [tensor([61, 62, 63, 64, 65])]\n",
      "type(v): <class 'list'>\n",
      "v[0]:  tensor([61, 62, 63, 64, 65])\n",
      "type(v[0]): <class 'torch.Tensor'>\n",
      "====================万能的分隔符====================\n"
     ]
    }
   ],
   "source": [
    "def collate_fn(batch):\n",
    "    nbatch={}\n",
    "    for b in batch:\n",
    "        for k, v in b.items():\n",
    "            nbatch[k] = nbatch.get(k, []) + [torch.tensor(v)] \n",
    "    return nbatch\n",
    "\n",
    "batch = [\n",
    "    [\n",
    "        {\"batch_1_context\":[1, 2, 3, 4, 5]},\n",
    "        {\"batch_1_answer\":[61, 62, 63, 64, 65]}\n",
    "    ],\n",
    "    [\n",
    "        {\"batch_2_context\":[11, 12, 13, 14, 15]},\n",
    "        {\"batch_2_answer\":[81, 82, 83, 84, 85]}\n",
    "    ]\n",
    "]\n",
    "result = collate_fn(batch[0])\n",
    "print(result)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "for k, v in result.items():\n",
    "    print(\"k: \", k)\n",
    "    print(\"v: \", v)\n",
    "    print(\"type(v):\", type(v))\n",
    "    print(\"v[0]: \", v[0])\n",
    "    print(\"type(v[0]):\", type(v[0]))\n",
    "    print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 9.y_pred = (y_pred > 0.5).long().data.numpy().astype(np.int32)\n",
    "\n",
    "#### tensor.detach()和tensor.data\n",
    "  * 两个都是生成无梯度的纯tensor，共享一片内存地址，即两者是等价的.**推荐使用detach()**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ True, False, False,  True],\n",
      "        [ True, False, False, False],\n",
      "        [False, False,  True, False],\n",
      "        [False, False, False, False]])\n",
      "<class 'torch.Tensor'>\n",
      "torch.bool\n",
      "====================万能的分隔符====================\n",
      "(y_pred > 0.5).long(): tensor([[1, 0, 0, 1],\n",
      "        [1, 0, 0, 0],\n",
      "        [0, 0, 1, 0],\n",
      "        [0, 0, 0, 0]])\n",
      "<class 'torch.Tensor'>\n",
      "torch.int64\n",
      "(y_pred > 0.5).long().data tensor([[1, 0, 0, 1],\n",
      "        [1, 0, 0, 0],\n",
      "        [0, 0, 1, 0],\n",
      "        [0, 0, 0, 0]])\n",
      "<class 'torch.Tensor'>\n",
      "torch.int64\n",
      "====================万能的分隔符====================\n",
      "[[1 0 0 1]\n",
      " [1 0 0 0]\n",
      " [0 0 1 0]\n",
      " [0 0 0 0]]\n",
      "<class 'numpy.ndarray'>\n",
      "int64\n",
      "[[1 0 0 1]\n",
      " [1 0 0 0]\n",
      " [0 0 1 0]\n",
      " [0 0 0 0]]\n",
      "<class 'numpy.ndarray'>\n",
      "int32\n"
     ]
    }
   ],
   "source": [
    "y_pred = torch.randn(4, 4)\n",
    "y_result = (y_pred > 0.5)\n",
    "print(y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "y_result = y_result.long()\n",
    "print(\"(y_pred > 0.5).long():\",y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "      \n",
    "y_result = y_result.data\n",
    "print(\"(y_pred > 0.5).long().data\",y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "y_result = y_result.numpy()\n",
    "print(y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)\n",
    "y_result = y_result.astype(np.int32)\n",
    "print(y_result)\n",
    "print(type(y_result))\n",
    "print(y_result.dtype)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=10>10.grad</span>\n",
    "* 梯度的长度代表函数增长或减少的趋势  \n",
    "* 梯度的方向代表函数的增长或减少的方向\n",
    "$$\n",
    "y = x^2 + 2x\n",
    "$$\n",
    "* **对矩阵求梯度在程序中的表现：**   \n",
    "    * 对矩阵每个位置按照给定的公式进行运算，然后把结果相加，再执行$backward()$得出的结果就是手动求导的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x:  tensor([2., 3., 4.], requires_grad=True)\n",
      "y: tensor([ 8., 15., 24.], grad_fn=<AddBackward0>)\n",
      "tensor(47., grad_fn=<SumBackward0>)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([ 6.,  8., 10.])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.arange(2,5, requires_grad=True,dtype=torch.float)\n",
    "print(\"x: \",x)\n",
    "y = x**2 + x*2\n",
    "print(\"y:\", y)\n",
    "z = y.sum() # dz/dy dy/dx\n",
    "print(z)\n",
    "z.backward() # 从z开始反向传播\n",
    "# y.backward()\n",
    "x.grad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x:  tensor([[2., 3., 4.],\n",
      "        [2., 3., 4.]], requires_grad=True)\n",
      "y: tensor([[13., 20., 29.],\n",
      "        [13., 20., 29.]], grad_fn=<AddBackward0>)\n",
      "tensor(124., grad_fn=<SumBackward0>)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([[ 6.,  8., 10.],\n",
       "        [ 6.,  8., 10.]])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.tensor([\n",
    "    [2, 3, 4],\n",
    "    [2, 3, 4]\n",
    "], requires_grad=True,dtype=torch.float)\n",
    "print(\"x: \",x)\n",
    "y = x**2 + x*2 + 5\n",
    "print(\"y:\", y)\n",
    "z = y.sum() # dz/dy dy/dx\n",
    "print(z)\n",
    "z.backward() # 从z开始反向传播\n",
    "# y.backward()\n",
    "x.grad"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 11.linspace\n",
    "### 按照等步长切分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 3.0000,  4.7500,  6.5000,  8.2500, 10.0000])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.linspace(3,10,steps=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-10.,  -5.,   0.,   5.,  10.])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.linspace(-10,10,steps=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-10.,  -5.,   0.,   5.,  10.])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.linspace(start=-10, end=10, steps=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=12>12.torch的维度</span>\n",
    "* 维度的理解 **压缩馍的状态，一层又一层**\n",
    "    * 以二维为例 \n",
    "        * dim=0表示每一行， 因此不论怎么操作都会压缩到一行上\n",
    "        * dim=1表示每一列， 因此不论怎么操作，最后的结果都会压缩到一列上"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 3])\n",
      "tensor([2, 4, 6])\n",
      "tensor([6, 6])\n"
     ]
    }
   ],
   "source": [
    "x = torch.tensor([\n",
    "     [1,2,3],\n",
    "     [1,2,3]\n",
    "])\n",
    "# 我们可以看到\"行\"是dim=0, \"列\"是dim=1\n",
    "print(x.shape)\n",
    "# dim=0表示是行，所以相加后，压缩为一行\n",
    "print(torch.sum(x,dim=0))\n",
    "print(torch.sum(x,dim=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 2, 3])\n",
      "tensor([[2, 3, 4],\n",
      "        [3, 4, 5]])\n",
      "tensor([[2, 4, 6],\n",
      "        [3, 3, 3]])\n",
      "tensor([[6, 6],\n",
      "        [3, 6]])\n"
     ]
    }
   ],
   "source": [
    "x = torch.tensor([\n",
    "     [\n",
    "         [1,2,3],\n",
    "         [1,2,3]\n",
    "     ],\n",
    "     [\n",
    "         [1,1,1],\n",
    "         [2,2,2]\n",
    "     ],\n",
    "])\n",
    "# 我们可以看到\"行\"是dim=0, \"列\"是dim=1\n",
    "print(x.shape)\n",
    "\n",
    "# dim=0表示是行，所以相加后，压缩为一行\n",
    "print(torch.sum(x,dim=0))\n",
    "print(torch.sum(x,dim=1))\n",
    "print(torch.sum(x,dim=2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 12.1维度的扩展\n",
    "### torch.unsqueeze(input, dim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.9857, -0.6358,  0.0561, -0.5355],\n",
      "        [ 0.6361,  0.6313, -0.6097,  0.4269]])\n",
      "torch.Size([2, 4])\n"
     ]
    }
   ],
   "source": [
    "a = torch.randn(2,4)\n",
    "print(a)\n",
    "print(a.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 2, 4])\n",
      "torch.Size([1, 2, 4, 1])\n"
     ]
    }
   ],
   "source": [
    "b =a.unsqueeze(0)\n",
    "print(b.shape)\n",
    "b =b.unsqueeze(3)\n",
    "print(b.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### torch.expand()\n",
    "只能对**维度为1**的进行操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([4, 2, 4, 4])\n"
     ]
    }
   ],
   "source": [
    "c = b.expand(4, 2, 4, 4)# 不能扩展成（4,4,4,4）,第一维必须为2，第二维必须为4\n",
    "print(c.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.torch.normal(means, std, out=None)\n",
    "## np.random.normal()\n",
    "* **返回一个张量，包含从给定参数means,std的离散正态分布中抽取随机数**\n",
    "   * 均值means是一个张量，包含每个输出元素相关的正态分布的均值。 \n",
    "   * std是一个张量，包含每个输出元素相关的正态分布的标准差。 \n",
    "   * 输出的值赋在shape里，默认为None\n",
    "\n",
    "均值和标准差的形状不须匹配，但每个张量的元素个数须相同\n",
    "***\n",
    "* **参数:**\n",
    "    * means (Tensor) – 均值  \n",
    "    * std (Tensor) – 标准差  \n",
    "    * out (Tensor) – 可选的输出张量  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 1.2273e-02,  7.4835e-01, -1.3282e-01, -6.1994e-02,  1.6517e-01,\n",
      "          8.9788e-01, -3.1598e-01,  2.8607e-01, -4.1446e-01, -1.4125e-01,\n",
      "         -8.2531e-02, -4.7220e-01, -4.3624e-01,  1.1695e-01,  5.9422e-01,\n",
      "         -1.6316e-01,  3.8213e-02, -2.5838e-01,  4.4078e-01,  6.5731e-01,\n",
      "          7.7186e-01,  3.9170e-01, -3.9051e-01, -7.3555e-01, -4.9958e-01,\n",
      "          9.8329e-01,  2.2631e-01,  4.6497e-01,  7.2126e-02,  7.0058e-01,\n",
      "          1.3925e-01, -6.4544e-01,  7.8581e-01, -2.3235e-01,  6.9324e-03,\n",
      "          2.4949e-02, -4.4438e-01, -1.0270e-01, -2.1606e-01, -6.4888e-01,\n",
      "          2.6227e-01, -3.4203e-01, -3.1624e-01,  6.4553e-01, -1.9155e-01,\n",
      "         -4.8444e-01,  2.9523e-01, -7.2925e-01, -8.1616e-01,  1.2992e-01,\n",
      "          1.0800e+00,  5.5357e-01,  7.1339e-01,  9.1651e-01, -5.6584e-01,\n",
      "          4.7701e-01,  4.4170e-01,  2.8430e-01, -1.8292e-01, -3.6355e-01,\n",
      "          7.8149e-02,  9.1948e-01, -9.1872e-01, -5.8835e-01, -1.0581e+00,\n",
      "         -1.2708e-01, -1.2187e-01, -2.3242e-01,  5.1491e-01, -2.0629e-02,\n",
      "         -3.6524e-01,  2.9517e-01, -1.1337e+00,  5.3497e-02,  5.7536e-01,\n",
      "         -4.2520e-01,  1.4826e-01,  1.0134e+00,  3.3542e-01, -2.3459e-01,\n",
      "          2.3620e-01,  8.7054e-01, -5.6947e-01, -1.0385e+00, -1.1007e+00,\n",
      "         -9.7086e-01,  5.4599e-01,  2.1376e-02, -4.2238e-01, -4.7935e-01,\n",
      "          3.3656e-01, -4.6925e-01, -5.5300e-01, -2.3844e-01,  9.1006e-01,\n",
      "          4.8782e-02,  2.5736e-01, -1.0003e-01,  2.3197e-01, -3.5065e-01,\n",
      "         -7.5737e-02, -3.7564e-01,  3.2928e-01,  5.9809e-01, -8.7176e-01,\n",
      "         -1.3153e-01, -1.8283e+00,  2.6005e-01,  1.3275e+00, -5.8701e-01,\n",
      "         -7.1501e-01, -4.5484e-01, -4.9455e-02, -6.3015e-01, -1.9703e-02,\n",
      "         -2.1867e-01, -7.4108e-01, -2.2907e-01, -2.2062e-01,  5.4160e-02,\n",
      "         -1.4322e-01,  3.4252e-01,  1.9349e-01,  3.6496e-01, -1.3748e-02,\n",
      "         -2.9532e-01,  1.7721e-01, -3.9620e-01,  4.8472e-01, -1.5630e-01,\n",
      "         -5.0819e-01, -4.6371e-01, -2.1908e-01,  3.0111e-01, -3.4382e-01,\n",
      "          6.6615e-01,  1.2653e-01, -6.6480e-01,  3.4775e-01, -4.5681e-01,\n",
      "         -1.8879e-01, -1.9452e-01,  1.7087e-01,  7.2642e-01, -3.5894e-01,\n",
      "          2.0839e-01, -2.8140e-01,  2.6341e-01,  7.3417e-03,  8.6316e-02,\n",
      "          8.7594e-02,  2.2895e-01, -2.6879e-01, -2.1376e-01,  5.2499e-01,\n",
      "         -1.1372e+00, -5.8629e-01, -2.6085e-01,  8.5455e-01, -6.6960e-01,\n",
      "         -9.5920e-02,  1.3356e-01,  4.0415e-01, -1.9312e-01, -3.1966e-01,\n",
      "         -4.0826e-01,  3.6665e-01, -2.3969e-01,  5.5056e-02,  7.1558e-01,\n",
      "         -9.1008e-02,  2.6967e-01,  8.6969e-02,  8.3823e-03,  1.1601e+00,\n",
      "          3.4711e-01, -1.8886e-01, -2.9048e-02, -6.0072e-01, -6.0432e-01,\n",
      "          8.2685e-01,  6.8429e-01, -6.8803e-01, -6.5938e-01, -1.3358e+00,\n",
      "          1.5848e-01, -7.2187e-01, -2.6797e-02,  4.3505e-01,  2.1579e-01,\n",
      "         -4.2099e-01,  1.2421e-01, -4.6229e-02, -7.3908e-01,  1.1912e-01,\n",
      "         -7.0364e-01, -7.7272e-01,  6.8527e-01, -2.9113e-01, -1.0569e-01,\n",
      "          2.5309e-01,  4.9690e-01,  1.5214e-01,  8.0991e-01, -5.5435e-01,\n",
      "         -9.3452e-01,  7.2505e-01,  7.6526e-01,  6.6908e-02, -6.4894e-02,\n",
      "          9.9260e-02,  6.9913e-01,  6.1342e-01,  1.1716e-01, -3.9598e-01,\n",
      "         -5.6994e-01,  5.3916e-02, -1.9696e-01, -7.4798e-01,  7.6333e-01,\n",
      "         -3.2944e-01,  7.0223e-01,  3.7215e-01, -6.0871e-01,  1.0023e-02,\n",
      "         -4.1550e-01,  3.4104e-02,  2.8558e-01,  1.9453e-01, -3.0449e-01,\n",
      "          3.8030e-01, -6.1661e-01,  4.8278e-02, -3.3815e-01, -5.3169e-01,\n",
      "         -1.0019e+00,  8.7693e-01, -5.5488e-01,  8.7281e-01,  4.4739e-01,\n",
      "         -2.5278e-01,  7.2545e-01, -4.3983e-01, -2.8109e-01,  2.4087e-01,\n",
      "         -9.6397e-01, -4.9157e-01,  1.5941e-01,  3.5857e-01, -5.0035e-01,\n",
      "          3.5471e-01, -8.7537e-02, -3.8154e-01, -2.7966e-02, -3.9808e-01,\n",
      "         -5.8748e-01,  3.4966e-01, -9.7331e-02, -4.4726e-01, -3.5440e-01,\n",
      "          5.8581e-01,  6.9004e-02, -2.8751e-01, -4.8133e-01, -2.4871e-01,\n",
      "          3.8125e-01,  1.0975e-01, -7.9658e-01,  3.2766e-01,  4.8836e-01,\n",
      "         -4.8372e-01,  2.8565e-02, -4.7619e-01,  1.2736e+00,  1.6527e-01,\n",
      "         -2.5714e-01,  1.9350e-01,  1.3908e-01, -6.2172e-01, -1.3449e-01,\n",
      "         -3.8632e-01, -5.1764e-03,  1.0638e+00,  3.1055e-01, -5.2834e-01,\n",
      "         -2.9207e-01, -1.3622e-02, -5.7014e-01,  3.5986e-01, -2.5949e-01,\n",
      "          1.9098e-02,  6.9268e-01, -1.2699e-01, -5.5918e-01, -2.4047e-01,\n",
      "          1.9972e-01,  3.2720e-02,  5.1262e-01, -2.4635e-01,  1.7554e-01,\n",
      "          1.7027e-01,  4.7512e-01, -2.5865e-01,  1.8223e-02,  7.5373e-01,\n",
      "          1.0655e+00,  1.2071e-01, -5.0895e-01, -6.1940e-01,  3.1112e-01,\n",
      "         -8.6611e-01,  1.2792e-01,  2.1851e-02, -9.6096e-02, -6.6312e-01,\n",
      "          7.3802e-01, -4.0558e-01,  3.8568e-01, -1.0311e-01, -5.0813e-02,\n",
      "          5.0910e-01, -6.8589e-02,  1.1963e-01,  1.6312e-01, -5.0996e-02,\n",
      "          1.4160e-01,  4.0853e-01, -3.2568e-01, -3.7555e-01, -2.6102e-01,\n",
      "         -1.8633e-02,  6.5191e-01,  2.7360e-01,  2.7263e-01,  1.5111e+00,\n",
      "          4.2126e-01,  3.4060e-01,  3.9031e-01, -2.7323e-02,  4.3016e-01,\n",
      "         -4.7514e-01,  1.2639e-01, -6.3775e-01, -4.1247e-01,  1.8071e-01,\n",
      "         -3.4580e-01,  5.4310e-02, -6.3711e-01,  3.6066e-01,  7.4200e-01,\n",
      "         -2.5336e-01, -1.1113e+00,  9.8496e-02,  1.7883e-01, -2.5474e-01,\n",
      "         -6.3783e-01,  1.9384e-01, -1.0246e-01,  6.1843e-02,  3.8454e-01,\n",
      "         -1.0602e-01, -6.1955e-01, -9.7833e-01,  1.3975e+00, -7.6230e-01,\n",
      "         -3.9772e-01,  5.7643e-01,  1.0371e-01, -2.5755e-01,  5.8592e-01,\n",
      "         -3.5627e-01, -3.8341e-01, -1.5968e-01, -5.4254e-01, -4.3656e-01,\n",
      "          5.6533e-02, -5.0624e-01,  5.3075e-01, -4.7476e-01, -5.2210e-01,\n",
      "         -1.6868e-01,  4.0641e-01, -5.9756e-02,  1.8061e-01,  3.6301e-01,\n",
      "          1.8933e-01, -4.4709e-02,  1.0415e-01,  2.5343e-01,  2.3350e-01,\n",
      "          2.4003e-01,  5.3054e-01,  3.9680e-02, -8.2193e-01, -8.4430e-02,\n",
      "         -6.2015e-01, -7.1136e-02,  1.2686e-01,  4.8579e-01,  8.5110e-01,\n",
      "          2.3095e-02, -3.2344e-01, -3.4812e-01, -7.4418e-01,  1.7543e-01,\n",
      "          6.3611e-01, -9.0133e-01,  5.6428e-01,  7.1067e-02,  8.2017e-01,\n",
      "          3.8596e-01, -1.5226e-01,  8.4405e-01, -6.1339e-01, -1.5014e-01,\n",
      "         -7.4431e-01, -4.1300e-01, -2.3570e-01, -1.6463e-01,  5.3218e-02,\n",
      "          5.6222e-01, -1.1733e-01,  3.3342e-01,  1.6228e-01, -9.6721e-01,\n",
      "          6.9281e-02, -6.8798e-01, -2.7037e-01,  5.8896e-01, -8.7124e-02,\n",
      "         -2.5399e-01,  2.7474e-01,  5.4477e-01,  4.6692e-01, -8.4591e-01,\n",
      "          2.7603e-01, -2.5280e-01,  5.7978e-01,  4.4150e-01,  1.3732e-01,\n",
      "         -6.4090e-01,  5.4920e-02,  7.7833e-01,  5.2998e-01, -2.5033e-01,\n",
      "          2.7179e-01,  2.1787e-01,  3.2549e-01, -4.7446e-01,  7.1911e-01,\n",
      "          1.3182e+00, -8.0925e-01,  6.3644e-01, -5.9469e-02, -5.1843e-01,\n",
      "          7.3387e-01,  3.2831e-01,  9.8654e-02, -5.2957e-02,  3.5922e-01,\n",
      "          1.1005e-01, -9.1777e-01,  3.5640e-01,  2.1386e-01,  1.2991e-01,\n",
      "          7.1257e-01,  1.0098e-01, -1.4702e-01,  1.6959e-01, -8.7778e-02,\n",
      "          1.6594e-01,  5.9672e-01, -1.1391e-01,  8.9991e-02,  2.3738e-01,\n",
      "         -1.1688e-01, -3.5034e-01,  2.2478e-01,  2.1923e-01, -1.0747e-01,\n",
      "         -2.3875e-01,  1.1560e+00, -3.7493e-02, -3.2303e-01, -2.8545e-01,\n",
      "         -1.6067e+00,  9.7808e-02, -2.6041e-02,  1.1096e+00, -9.0075e-02,\n",
      "          7.2170e-02,  4.6830e-01,  3.4448e-01,  2.8523e-02,  8.0302e-01,\n",
      "         -7.2711e-02,  2.3602e-01, -4.4707e-01,  2.4297e-01,  7.0951e-02,\n",
      "          1.1187e+00, -5.7617e-01,  3.2261e-01, -3.8547e-01,  2.2999e-01,\n",
      "          1.0852e+00, -1.0439e+00, -5.3594e-01,  3.3731e-01,  5.7054e-01,\n",
      "         -3.1643e-01,  3.5367e-01, -6.4163e-02,  5.5158e-01, -9.3546e-02,\n",
      "          2.1345e-01,  5.2892e-01,  1.2096e-01, -1.5620e+00, -3.8493e-01,\n",
      "         -8.8567e-01,  4.0154e-01,  8.4002e-01, -1.7042e-01,  4.3904e-01,\n",
      "          5.5347e-01, -1.3409e+00,  9.4720e-01,  1.8480e+00,  1.8179e-01,\n",
      "          9.5062e-01, -8.6671e-01,  4.6810e-02,  4.2708e-01,  2.7474e-02,\n",
      "         -2.7541e-01,  3.5343e-01,  1.0370e+00,  1.7369e-01, -1.3833e-01,\n",
      "          4.7437e-01,  5.7919e-02, -4.6126e-01,  2.2544e-01, -5.3690e-01,\n",
      "         -5.0817e-01, -6.6256e-01, -2.9912e-01,  1.0070e-01,  8.5988e-02,\n",
      "         -2.6803e-01,  4.3557e-01,  9.2565e-01, -3.3029e-01,  4.0514e-01,\n",
      "          6.3587e-01,  3.2977e-01,  2.2383e-02, -3.4269e-01, -4.9917e-01,\n",
      "          7.4565e-01,  8.9591e-01,  2.7937e-01,  7.2524e-01,  2.5860e-01,\n",
      "          5.5744e-01,  7.8315e-01,  1.9354e-02,  2.6407e-01, -5.5702e-01,\n",
      "         -2.9665e-01, -1.3493e+00,  9.3698e-02, -2.8142e-01,  1.3958e-01,\n",
      "         -3.3071e-02,  3.2645e-01, -4.9883e-01,  7.4091e-01, -1.6372e-01,\n",
      "          2.6196e-01,  1.1472e+00,  7.0576e-03, -5.1345e-01,  1.4422e-03,\n",
      "         -1.1590e-01,  8.8205e-02, -1.5383e-01,  7.9261e-01,  4.6508e-01,\n",
      "         -4.3726e-01,  3.0240e-01, -5.7124e-01, -3.9531e-01, -7.1596e-01,\n",
      "          2.2454e-01, -1.2907e-01,  1.2299e-01,  1.6948e-03,  1.0093e+00,\n",
      "          4.9962e-01, -7.1514e-02,  4.1827e-02, -3.6283e-02, -1.7787e-01,\n",
      "          2.0465e-01,  6.0260e-01,  4.5602e-01, -6.6239e-01,  3.4886e-01,\n",
      "          1.4262e-01, -2.6609e-01,  1.7416e-01, -1.2413e-01, -2.2524e-01,\n",
      "         -5.7405e-01,  3.3115e-01, -7.2398e-01,  1.1515e+00, -4.0031e-01,\n",
      "          7.8647e-02,  3.6354e-01, -8.7080e-01, -2.3325e-01, -4.6191e-01,\n",
      "          2.9117e-01,  4.0568e-01,  6.4380e-03,  2.8555e-01,  3.0297e-01,\n",
      "          2.7607e-01, -2.4216e-01,  1.9404e-01,  4.5064e-01,  2.1092e-01,\n",
      "         -9.1525e-02,  7.5726e-02, -2.5644e-01, -6.4953e-01, -5.1978e-03,\n",
      "         -3.1468e-01, -6.2765e-01, -7.7948e-01, -6.6772e-02, -2.1063e-01,\n",
      "         -6.2588e-01, -6.4524e-03, -1.5952e-01, -5.0813e-01, -3.7080e-01,\n",
      "         -1.5340e-01, -5.7667e-01, -5.2371e-01, -7.2032e-01, -1.1306e+00,\n",
      "         -6.3853e-01, -4.4095e-01,  2.8334e-01, -1.3657e+00,  7.4500e-02,\n",
      "         -3.2178e-01, -6.8727e-02, -6.5769e-03, -3.4998e-01, -5.3688e-01,\n",
      "         -7.9232e-01,  1.2149e-01, -3.8635e-01,  1.9341e-01,  9.2812e-01,\n",
      "         -4.2283e-01, -7.4898e-01, -1.7693e-01, -4.3876e-01,  2.7390e-01,\n",
      "         -1.1664e+00,  1.0426e-01, -7.8937e-01,  1.0608e-02, -2.6819e-02,\n",
      "          1.7635e-01,  2.2698e-01,  1.7238e-02, -8.7979e-02,  4.1112e-01,\n",
      "         -5.2005e-02, -1.7271e-01, -3.9660e-01,  7.6554e-01,  2.5289e-01,\n",
      "          2.0580e-01, -1.4295e-01,  4.3278e-02,  2.7440e-01,  4.0185e-01,\n",
      "         -3.0877e-01, -1.0418e-01,  2.7250e-01, -2.9236e-01, -2.1935e-01,\n",
      "         -1.9183e-01,  8.9662e-01,  1.9675e-01,  1.4411e-01,  7.2696e-01,\n",
      "          3.8874e-01,  6.0690e-01, -3.2223e-01, -1.1653e-01,  3.3849e-01,\n",
      "         -1.1918e-02, -5.1683e-01,  4.8295e-01,  1.0428e-01, -1.3586e+00,\n",
      "          4.9713e-01, -2.1911e-01, -1.3369e-01,  1.5306e-01,  7.0853e-01,\n",
      "          3.1067e-01,  6.5483e-02,  4.6012e-01, -2.5348e-01, -4.0982e-01,\n",
      "          1.4163e-01, -3.4115e-01,  2.4364e-01, -2.8798e-01,  2.1597e-01,\n",
      "         -6.7507e-01, -7.0393e-01,  9.5761e-03,  5.8843e-01,  5.6361e-01,\n",
      "         -3.3447e-01, -4.4286e-01,  5.0472e-01,  3.1347e-01, -2.5350e-01,\n",
      "         -4.6692e-01, -2.1659e-01, -6.2556e-02,  5.1013e-01, -6.4882e-01,\n",
      "          6.7020e-01,  3.0562e-03, -5.6034e-01, -5.8527e-01,  5.4854e-01,\n",
      "         -4.5042e-01, -1.3553e-01,  8.7915e-01,  6.3332e-01,  8.0163e-03,\n",
      "         -2.8118e-01,  7.3482e-02, -9.1491e-02,  4.6445e-01,  6.5574e-01,\n",
      "         -3.3760e-01,  1.2408e-01, -6.8890e-02, -4.1315e-01, -3.1267e-02,\n",
      "         -1.0383e+00, -4.3696e-01, -6.7600e-01, -5.4011e-01, -1.3670e+00,\n",
      "          5.4630e-01, -1.1821e+00, -7.1300e-01, -1.3901e-01, -1.9310e-01,\n",
      "         -3.0985e-01,  1.1379e-02,  4.8886e-01, -3.3068e-01,  2.5948e-01,\n",
      "          1.0395e+00,  3.6854e-01,  2.9717e-01,  2.4904e-01, -5.9798e-01,\n",
      "         -2.9150e-01, -8.5006e-02,  7.2358e-01,  3.0695e-01, -7.5833e-01,\n",
      "         -2.0854e-02, -6.6151e-01,  1.3835e+00, -1.6002e-01, -2.8662e-02,\n",
      "          9.7716e-01, -1.3917e-01,  7.5920e-02, -4.2392e-01,  1.7789e-01,\n",
      "         -9.8114e-01, -6.6725e-01, -8.8369e-01, -2.1210e-01, -4.5457e-01,\n",
      "         -5.6082e-01, -4.3520e-01,  7.6983e-01, -3.3901e-01, -8.4012e-01,\n",
      "         -2.8169e-01,  7.4624e-01, -1.0565e-01,  2.6545e-01, -1.0184e-01,\n",
      "         -8.1986e-01,  1.2039e+00,  4.1794e-02,  3.6502e-01, -5.1386e-01,\n",
      "         -1.2314e-01, -3.3312e-01,  1.0098e-01, -5.8986e-01, -9.4891e-02,\n",
      "         -9.1906e-02,  2.6845e-02,  2.7716e-01,  1.6194e-01, -9.7920e-01,\n",
      "          4.7081e-01, -2.1252e-01, -7.7979e-02, -8.9119e-02, -5.0958e-01,\n",
      "          3.4818e-02, -8.7144e-02, -1.6636e-02, -6.8116e-01, -3.5688e-01,\n",
      "         -5.2267e-01, -1.0426e+00,  4.3874e-01, -9.5921e-01, -6.6288e-01,\n",
      "          8.3772e-01, -6.7887e-01, -2.2625e-01,  4.0388e-01,  1.1131e-01,\n",
      "          7.4827e-01,  3.9762e-01, -5.1348e-01, -7.1388e-02,  7.5222e-01,\n",
      "          4.9168e-01, -3.4850e-01,  6.5632e-01, -3.5862e-02, -7.6451e-01,\n",
      "         -1.0643e+00, -7.1596e-01,  3.0514e-01, -4.7670e-01, -4.3996e-01,\n",
      "          4.2324e-01,  8.6857e-02, -9.7187e-02,  1.9531e-01,  1.4954e-01,\n",
      "         -6.0953e-01, -5.9275e-01, -1.4941e-01, -1.4768e-01,  2.5525e-01,\n",
      "         -1.3443e-01,  4.1979e-02,  1.1522e-02, -1.8297e-02,  2.4580e-01,\n",
      "          4.6332e-01,  6.1024e-01,  2.5878e-01, -1.5241e-01,  1.0700e-01,\n",
      "         -6.2431e-01, -2.4820e-01,  1.9369e-01, -6.2265e-01,  1.1358e+00,\n",
      "          1.7817e-01,  8.1806e-01, -1.3069e-01, -6.6886e-03, -3.4585e-01,\n",
      "          1.3041e-02, -5.4588e-01,  3.9392e-01,  1.9699e-01, -8.4927e-02,\n",
      "          4.1249e-01,  3.2165e-01, -1.3423e-01, -5.2191e-01,  7.6870e-02,\n",
      "          2.8968e-01, -2.1443e-01,  8.1181e-02, -3.4567e-01, -1.0782e-01,\n",
      "          5.2866e-01, -4.6170e-01,  2.1291e-01,  2.9502e-01,  2.4275e-01,\n",
      "          8.3800e-01, -2.7294e-01, -9.3519e-01,  2.0471e-01,  5.8935e-01,\n",
      "         -5.8433e-01, -1.0206e+00,  7.6979e-01, -5.4517e-01, -4.6790e-01,\n",
      "          3.5554e-01,  3.1895e-01,  3.6003e-01, -4.7173e-02,  5.8367e-01,\n",
      "         -2.9467e-01,  6.6066e-01,  1.4720e-01,  4.1742e-01,  4.9242e-01,\n",
      "         -1.0208e-01, -7.9387e-02, -7.8465e-01, -5.8269e-01,  4.9929e-02,\n",
      "         -1.0046e+00, -1.4300e-01, -5.7765e-01,  5.4394e-01,  4.4296e-01,\n",
      "         -1.2901e-01, -3.8039e-01,  3.4361e-01,  4.2777e-01, -5.1322e-01,\n",
      "         -1.1279e+00, -7.2741e-01,  3.9575e-01,  3.6604e-01, -6.4139e-01,\n",
      "          1.0240e-01, -4.0141e-01,  3.9464e-01, -4.8366e-01,  3.6785e-01,\n",
      "         -2.4785e-01,  5.5389e-01,  6.7000e-02,  1.6006e-01, -1.0591e+00,\n",
      "          7.0175e-01, -2.1334e-01,  9.9271e-01, -5.3866e-01,  1.1406e+00,\n",
      "          6.8217e-01, -1.6413e-01, -1.4068e-02,  7.7950e-01, -4.7290e-01,\n",
      "          3.2612e-01,  4.3228e-01, -9.3818e-01,  2.8406e-01, -7.6596e-01,\n",
      "         -3.2834e-01, -5.8777e-01, -4.1277e-01,  2.2335e-01, -7.7866e-01,\n",
      "          2.6294e-01,  3.8550e-01, -6.1232e-02, -1.0132e+00,  2.8121e-01,\n",
      "          5.0719e-01,  4.3639e-01,  1.8844e-01, -1.9635e-01,  2.8061e-01,\n",
      "         -6.9880e-01, -5.3925e-01, -1.0653e-01,  1.4419e-01, -4.4051e-01]])\n",
      "[ 1.22727873e-02  7.48352587e-01 -1.32815078e-01 -6.19937442e-02\n",
      "  1.65171713e-01  8.97878826e-01 -3.15978974e-01  2.86068141e-01\n",
      " -4.14457828e-01 -1.41250059e-01 -8.25308785e-02 -4.72196847e-01\n",
      " -4.36242521e-01  1.16949566e-01  5.94217002e-01 -1.63156837e-01\n",
      "  3.82128172e-02 -2.58384764e-01  4.40780491e-01  6.57312870e-01\n",
      "  7.71863461e-01  3.91702652e-01 -3.90505552e-01 -7.35545695e-01\n",
      " -4.99583542e-01  9.83294845e-01  2.26312414e-01  4.64970350e-01\n",
      "  7.21258447e-02  7.00575233e-01  1.39245525e-01 -6.45441413e-01\n",
      "  7.85808742e-01 -2.32349947e-01  6.93236152e-03  2.49488521e-02\n",
      " -4.44382071e-01 -1.02702141e-01 -2.16057122e-01 -6.48884535e-01\n",
      "  2.62267262e-01 -3.42027426e-01 -3.16244900e-01  6.45526707e-01\n",
      " -1.91551566e-01 -4.84440237e-01  2.95233130e-01 -7.29248226e-01\n",
      " -8.16158116e-01  1.29923239e-01  1.08000433e+00  5.53566396e-01\n",
      "  7.13387609e-01  9.16509807e-01 -5.65835774e-01  4.77005780e-01\n",
      "  4.41699058e-01  2.84304857e-01 -1.82915613e-01 -3.63546580e-01\n",
      "  7.81491697e-02  9.19481039e-01 -9.18720663e-01 -5.88351250e-01\n",
      " -1.05810809e+00 -1.27077296e-01 -1.21872388e-01 -2.32422337e-01\n",
      "  5.14911771e-01 -2.06291620e-02 -3.65239173e-01  2.95167685e-01\n",
      " -1.13369906e+00  5.34968972e-02  5.75363040e-01 -4.25202340e-01\n",
      "  1.48257941e-01  1.01341069e+00  3.35421413e-01 -2.34586105e-01\n",
      "  2.36203447e-01  8.70539546e-01 -5.69472194e-01 -1.03846538e+00\n",
      " -1.10067940e+00 -9.70864594e-01  5.45985878e-01  2.13756766e-02\n",
      " -4.22380626e-01 -4.79347289e-01  3.36564273e-01 -4.69249994e-01\n",
      " -5.52999437e-01 -2.38444254e-01  9.10059154e-01  4.87816557e-02\n",
      "  2.57358670e-01 -1.00026898e-01  2.31974214e-01 -3.50651592e-01\n",
      " -7.57368654e-02 -3.75642687e-01  3.29280168e-01  5.98090231e-01\n",
      " -8.71762037e-01 -1.31526455e-01 -1.82834780e+00  2.60051906e-01\n",
      "  1.32748699e+00 -5.87009072e-01 -7.15005040e-01 -4.54837263e-01\n",
      " -4.94546928e-02 -6.30145431e-01 -1.97029840e-02 -2.18673050e-01\n",
      " -7.41079450e-01 -2.29074523e-01 -2.20619336e-01  5.41601516e-02\n",
      " -1.43221393e-01  3.42522413e-01  1.93488151e-01  3.64959806e-01\n",
      " -1.37482518e-02 -2.95323551e-01  1.77208960e-01 -3.96202356e-01\n",
      "  4.84716445e-01 -1.56301558e-01 -5.08186817e-01 -4.63710576e-01\n",
      " -2.19076157e-01  3.01108629e-01 -3.43821049e-01  6.66146755e-01\n",
      "  1.26529962e-01 -6.64799571e-01  3.47754210e-01 -4.56809610e-01\n",
      " -1.88791603e-01 -1.94520652e-01  1.70871511e-01  7.26420224e-01\n",
      " -3.58939201e-01  2.08387122e-01 -2.81397730e-01  2.63410777e-01\n",
      "  7.34170293e-03  8.63155723e-02  8.75935107e-02  2.28954658e-01\n",
      " -2.68787980e-01 -2.13755965e-01  5.24989367e-01 -1.13724971e+00\n",
      " -5.86285114e-01 -2.60847032e-01  8.54545057e-01 -6.69600844e-01\n",
      " -9.59202349e-02  1.33559242e-01  4.04152423e-01 -1.93122625e-01\n",
      " -3.19662660e-01 -4.08255249e-01  3.66645992e-01 -2.39690229e-01\n",
      "  5.50564714e-02  7.15577483e-01 -9.10081193e-02  2.69671857e-01\n",
      "  8.69693086e-02  8.38232413e-03  1.16006327e+00  3.47114950e-01\n",
      " -1.88858509e-01 -2.90478840e-02 -6.00723207e-01 -6.04324281e-01\n",
      "  8.26853216e-01  6.84288144e-01 -6.88033879e-01 -6.59377456e-01\n",
      " -1.33579564e+00  1.58475399e-01 -7.21866608e-01 -2.67966986e-02\n",
      "  4.35053170e-01  2.15787604e-01 -4.20992345e-01  1.24210246e-01\n",
      " -4.62288707e-02 -7.39082158e-01  1.19123928e-01 -7.03640819e-01\n",
      " -7.72721887e-01  6.85274363e-01 -2.91125268e-01 -1.05690829e-01\n",
      "  2.53093451e-01  4.96897429e-01  1.52137786e-01  8.09910655e-01\n",
      " -5.54348052e-01 -9.34517860e-01  7.25045681e-01  7.65261054e-01\n",
      "  6.69083595e-02 -6.48944303e-02  9.92596969e-02  6.99126542e-01\n",
      "  6.13419414e-01  1.17156602e-01 -3.95983428e-01 -5.69939196e-01\n",
      "  5.39164841e-02 -1.96961582e-01 -7.47977674e-01  7.63326824e-01\n",
      " -3.29440564e-01  7.02234387e-01  3.72148067e-01 -6.08708501e-01\n",
      "  1.00228926e-02 -4.15503591e-01  3.41042317e-02  2.85575151e-01\n",
      "  1.94532692e-01 -3.04487050e-01  3.80295992e-01 -6.16609395e-01\n",
      "  4.82782125e-02 -3.38149667e-01 -5.31688869e-01 -1.00185776e+00\n",
      "  8.76926005e-01 -5.54878891e-01  8.72809708e-01  4.47393477e-01\n",
      " -2.52781779e-01  7.25453317e-01 -4.39830989e-01 -2.81088918e-01\n",
      "  2.40874708e-01 -9.63972807e-01 -4.91573185e-01  1.59410238e-01\n",
      "  3.58572096e-01 -5.00348151e-01  3.54705155e-01 -8.75371695e-02\n",
      " -3.81543219e-01 -2.79657096e-02 -3.98081899e-01 -5.87483883e-01\n",
      "  3.49657834e-01 -9.73305851e-02 -4.47259039e-01 -3.54397714e-01\n",
      "  5.85810304e-01  6.90039098e-02 -2.87505716e-01 -4.81334358e-01\n",
      " -2.48714909e-01  3.81252468e-01  1.09748557e-01 -7.96580017e-01\n",
      "  3.27657312e-01  4.88363117e-01 -4.83720660e-01  2.85647027e-02\n",
      " -4.76189077e-01  1.27359343e+00  1.65270254e-01 -2.57144421e-01\n",
      "  1.93496659e-01  1.39079884e-01 -6.21717334e-01 -1.34486705e-01\n",
      " -3.86315554e-01 -5.17640309e-03  1.06377506e+00  3.10550570e-01\n",
      " -5.28341770e-01 -2.92071939e-01 -1.36222523e-02 -5.70138335e-01\n",
      "  3.59860331e-01 -2.59490550e-01  1.90977994e-02  6.92683637e-01\n",
      " -1.26988530e-01 -5.59181750e-01 -2.40469113e-01  1.99721992e-01\n",
      "  3.27202901e-02  5.12618959e-01 -2.46354625e-01  1.75537348e-01\n",
      "  1.70267120e-01  4.75123882e-01 -2.58652061e-01  1.82228424e-02\n",
      "  7.53727138e-01  1.06548667e+00  1.20714039e-01 -5.08948863e-01\n",
      " -6.19398892e-01  3.11119288e-01 -8.66112590e-01  1.27915680e-01\n",
      "  2.18506213e-02 -9.60956588e-02 -6.63115323e-01  7.38023818e-01\n",
      " -4.05576140e-01  3.85677904e-01 -1.03113346e-01 -5.08126207e-02\n",
      "  5.09103000e-01 -6.85894117e-02  1.19629137e-01  1.63116932e-01\n",
      " -5.09958304e-02  1.41603425e-01  4.08526361e-01 -3.25683773e-01\n",
      " -3.75553846e-01 -2.61018962e-01 -1.86331477e-02  6.51906669e-01\n",
      "  2.73604691e-01  2.72630811e-01  1.51114070e+00  4.21261996e-01\n",
      "  3.40597600e-01  3.90314430e-01 -2.73233149e-02  4.30160999e-01\n",
      " -4.75136250e-01  1.26388267e-01 -6.37745440e-01 -4.12470281e-01\n",
      "  1.80710286e-01 -3.45803112e-01  5.43101132e-02 -6.37110054e-01\n",
      "  3.60657096e-01  7.42004871e-01 -2.53356844e-01 -1.11128020e+00\n",
      "  9.84956771e-02  1.78826123e-01 -2.54739255e-01 -6.37831151e-01\n",
      "  1.93838045e-01 -1.02455817e-01  6.18429556e-02  3.84536684e-01\n",
      " -1.06022529e-01 -6.19554877e-01 -9.78328526e-01  1.39745021e+00\n",
      " -7.62302697e-01 -3.97722989e-01  5.76430976e-01  1.03708997e-01\n",
      " -2.57547349e-01  5.85916281e-01 -3.56267005e-01 -3.83406103e-01\n",
      " -1.59683287e-01 -5.42542279e-01 -4.36559141e-01  5.65334670e-02\n",
      " -5.06241024e-01  5.30747890e-01 -4.74756449e-01 -5.22095561e-01\n",
      " -1.68678552e-01  4.06411082e-01 -5.97562008e-02  1.80614427e-01\n",
      "  3.63014013e-01  1.89333543e-01 -4.47087623e-02  1.04148127e-01\n",
      "  2.53427863e-01  2.33500928e-01  2.40032881e-01  5.30536771e-01\n",
      "  3.96798551e-02 -8.21929276e-01 -8.44303817e-02 -6.20146275e-01\n",
      " -7.11357445e-02  1.26856849e-01  4.85789090e-01  8.51103127e-01\n",
      "  2.30951197e-02 -3.23435366e-01 -3.48123252e-01 -7.44177103e-01\n",
      "  1.75425053e-01  6.36108637e-01 -9.01329994e-01  5.64282954e-01\n",
      "  7.10671395e-02  8.20167303e-01  3.85957688e-01 -1.52259037e-01\n",
      "  8.44046116e-01 -6.13388181e-01 -1.50140092e-01 -7.44306028e-01\n",
      " -4.12999719e-01 -2.35699520e-01 -1.64628983e-01  5.32179810e-02\n",
      "  5.62216699e-01 -1.17325187e-01  3.33421111e-01  1.62279278e-01\n",
      " -9.67213571e-01  6.92811981e-02 -6.87975705e-01 -2.70365357e-01\n",
      "  5.88957131e-01 -8.71236771e-02 -2.53990352e-01  2.74740964e-01\n",
      "  5.44768691e-01  4.66922522e-01 -8.45906556e-01  2.76027083e-01\n",
      " -2.52798885e-01  5.79784572e-01  4.41503346e-01  1.37320772e-01\n",
      " -6.40897572e-01  5.49199991e-02  7.78329968e-01  5.29983759e-01\n",
      " -2.50331342e-01  2.71787763e-01  2.17870772e-01  3.25487822e-01\n",
      " -4.74458665e-01  7.19111562e-01  1.31819689e+00 -8.09253573e-01\n",
      "  6.36439681e-01 -5.94691783e-02 -5.18433034e-01  7.33870745e-01\n",
      "  3.28310132e-01  9.86535549e-02 -5.29565699e-02  3.59224886e-01\n",
      "  1.10046834e-01 -9.17773128e-01  3.56403857e-01  2.13857636e-01\n",
      "  1.29910111e-01  7.12568521e-01  1.00977607e-01 -1.47017106e-01\n",
      "  1.69593602e-01 -8.77775326e-02  1.65940538e-01  5.96719980e-01\n",
      " -1.13906048e-01  8.99908692e-02  2.37378672e-01 -1.16876222e-01\n",
      " -3.50338876e-01  2.24776447e-01  2.19230309e-01 -1.07466780e-01\n",
      " -2.38746688e-01  1.15600383e+00 -3.74934077e-02 -3.23032349e-01\n",
      " -2.85454601e-01 -1.60666740e+00  9.78081599e-02 -2.60410700e-02\n",
      "  1.10959351e+00 -9.00747627e-02  7.21703395e-02  4.68304366e-01\n",
      "  3.44479412e-01  2.85231583e-02  8.03024054e-01 -7.27106035e-02\n",
      "  2.36020729e-01 -4.47065383e-01  2.42967457e-01  7.09510222e-02\n",
      "  1.11873913e+00 -5.76168478e-01  3.22611213e-01 -3.85470718e-01\n",
      "  2.29992300e-01  1.08517361e+00 -1.04393685e+00 -5.35943329e-01\n",
      "  3.37313920e-01  5.70540309e-01 -3.16430211e-01  3.53674620e-01\n",
      " -6.41632229e-02  5.51583588e-01 -9.35457796e-02  2.13449150e-01\n",
      "  5.28924108e-01  1.20958470e-01 -1.56202579e+00 -3.84932488e-01\n",
      " -8.85665774e-01  4.01535541e-01  8.40023994e-01 -1.70418292e-01\n",
      "  4.39037234e-01  5.53474367e-01 -1.34089947e+00  9.47195232e-01\n",
      "  1.84802008e+00  1.81791335e-01  9.50619638e-01 -8.66705716e-01\n",
      "  4.68103997e-02  4.27082658e-01  2.74739414e-02 -2.75412381e-01\n",
      "  3.53432178e-01  1.03696811e+00  1.73691243e-01 -1.38326228e-01\n",
      "  4.74372506e-01  5.79192601e-02 -4.61259395e-01  2.25435376e-01\n",
      " -5.36898971e-01 -5.08174837e-01 -6.62557602e-01 -2.99115092e-01\n",
      "  1.00703016e-01  8.59875232e-02 -2.68030524e-01  4.35572922e-01\n",
      "  9.25654590e-01 -3.30293685e-01  4.05142963e-01  6.35868192e-01\n",
      "  3.29769105e-01  2.23831050e-02 -3.42690051e-01 -4.99166667e-01\n",
      "  7.45647252e-01  8.95908177e-01  2.79370040e-01  7.25241005e-01\n",
      "  2.58600771e-01  5.57444394e-01  7.83146977e-01  1.93542894e-02\n",
      "  2.64074624e-01 -5.57016253e-01 -2.96646893e-01 -1.34925199e+00\n",
      "  9.36977118e-02 -2.81419128e-01  1.39581114e-01 -3.30709890e-02\n",
      "  3.26454878e-01 -4.98828113e-01  7.40910292e-01 -1.63717255e-01\n",
      "  2.61960298e-01  1.14718986e+00  7.05757830e-03 -5.13446450e-01\n",
      "  1.44218409e-03 -1.15904510e-01  8.82046893e-02 -1.53832838e-01\n",
      "  7.92606473e-01  4.65084136e-01 -4.37260509e-01  3.02402705e-01\n",
      " -5.71237206e-01 -3.95312816e-01 -7.15963066e-01  2.24542961e-01\n",
      " -1.29065156e-01  1.22991711e-01  1.69480010e-03  1.00929797e+00\n",
      "  4.99623626e-01 -7.15143830e-02  4.18273471e-02 -3.62831242e-02\n",
      " -1.77868560e-01  2.04652637e-01  6.02602363e-01  4.56019491e-01\n",
      " -6.62389815e-01  3.48863482e-01  1.42620400e-01 -2.66086429e-01\n",
      "  1.74161389e-01 -1.24134801e-01 -2.25241587e-01 -5.74049354e-01\n",
      "  3.31153572e-01 -7.23984063e-01  1.15147626e+00 -4.00305569e-01\n",
      "  7.86467716e-02  3.63538861e-01 -8.70802462e-01 -2.33254939e-01\n",
      " -4.61910725e-01  2.91166335e-01  4.05682623e-01  6.43800851e-03\n",
      "  2.85546690e-01  3.02969664e-01  2.76073158e-01 -2.42156863e-01\n",
      "  1.94042802e-01  4.50643957e-01  2.10922271e-01 -9.15245414e-02\n",
      "  7.57256225e-02 -2.56440312e-01 -6.49529576e-01 -5.19775040e-03\n",
      " -3.14675301e-01 -6.27650857e-01 -7.79482782e-01 -6.67722598e-02\n",
      " -2.10631579e-01 -6.25875711e-01 -6.45242399e-03 -1.59522265e-01\n",
      " -5.08133769e-01 -3.70799363e-01 -1.53404117e-01 -5.76668501e-01\n",
      " -5.23710191e-01 -7.20319152e-01 -1.13064814e+00 -6.38528407e-01\n",
      " -4.40952212e-01  2.83340812e-01 -1.36573052e+00  7.44995102e-02\n",
      " -3.21779102e-01 -6.87268674e-02 -6.57693716e-03 -3.49978894e-01\n",
      " -5.36876678e-01 -7.92316794e-01  1.21492103e-01 -3.86350572e-01\n",
      "  1.93412974e-01  9.28120971e-01 -4.22825903e-01 -7.48975515e-01\n",
      " -1.76928937e-01 -4.38756913e-01  2.73899108e-01 -1.16637087e+00\n",
      "  1.04259446e-01 -7.89373100e-01  1.06077306e-02 -2.68191993e-02\n",
      "  1.76353231e-01  2.26979688e-01  1.72384344e-02 -8.79790783e-02\n",
      "  4.11115170e-01 -5.20047247e-02 -1.72711372e-01 -3.96599233e-01\n",
      "  7.65538335e-01  2.52892673e-01  2.05804884e-01 -1.42948553e-01\n",
      "  4.32782955e-02  2.74404228e-01  4.01848376e-01 -3.08773577e-01\n",
      " -1.04178697e-01  2.72498190e-01 -2.92358547e-01 -2.19351947e-01\n",
      " -1.91829816e-01  8.96616518e-01  1.96748495e-01  1.44111693e-01\n",
      "  7.26957023e-01  3.88736665e-01  6.06902242e-01 -3.22232634e-01\n",
      " -1.16533808e-01  3.38486701e-01 -1.19180055e-02 -5.16826749e-01\n",
      "  4.82954413e-01  1.04275018e-01 -1.35858738e+00  4.97127295e-01\n",
      " -2.19108194e-01 -1.33685991e-01  1.53063238e-01  7.08529770e-01\n",
      "  3.10672611e-01  6.54833391e-02  4.60118711e-01 -2.53477156e-01\n",
      " -4.09821123e-01  1.41634852e-01 -3.41153532e-01  2.43638203e-01\n",
      " -2.87980884e-01  2.15966597e-01 -6.75074100e-01 -7.03928947e-01\n",
      "  9.57611017e-03  5.88434577e-01  5.63607395e-01 -3.34471256e-01\n",
      " -4.42860186e-01  5.04718482e-01  3.13474566e-01 -2.53497064e-01\n",
      " -4.66921419e-01 -2.16593012e-01 -6.25558197e-02  5.10134757e-01\n",
      " -6.48815751e-01  6.70198143e-01  3.05621279e-03 -5.60338199e-01\n",
      " -5.85269868e-01  5.48541248e-01 -4.50415522e-01 -1.35528460e-01\n",
      "  8.79151881e-01  6.33319139e-01  8.01625103e-03 -2.81182438e-01\n",
      "  7.34821483e-02 -9.14911553e-02  4.64446306e-01  6.55743599e-01\n",
      " -3.37599993e-01  1.24076791e-01 -6.88895509e-02 -4.13154870e-01\n",
      " -3.12668942e-02 -1.03831840e+00 -4.36964720e-01 -6.75996840e-01\n",
      " -5.40110946e-01 -1.36695373e+00  5.46296120e-01 -1.18211329e+00\n",
      " -7.13001072e-01 -1.39009655e-01 -1.93098813e-01 -3.09850097e-01\n",
      "  1.13788145e-02  4.88856733e-01 -3.30684155e-01  2.59484887e-01\n",
      "  1.03952348e+00  3.68544370e-01  2.97170788e-01  2.49043107e-01\n",
      " -5.97980618e-01 -2.91499257e-01 -8.50055963e-02  7.23575115e-01\n",
      "  3.06954026e-01 -7.58331656e-01 -2.08535418e-02 -6.61509633e-01\n",
      "  1.38347054e+00 -1.60018131e-01 -2.86616869e-02  9.77163196e-01\n",
      " -1.39169186e-01  7.59197250e-02 -4.23917413e-01  1.77894235e-01\n",
      " -9.81144667e-01 -6.67253971e-01 -8.83688569e-01 -2.12102339e-01\n",
      " -4.54573154e-01 -5.60821772e-01 -4.35198814e-01  7.69834697e-01\n",
      " -3.39013994e-01 -8.40124488e-01 -2.81689107e-01  7.46238768e-01\n",
      " -1.05646826e-01  2.65449703e-01 -1.01839758e-01 -8.19858372e-01\n",
      "  1.20393312e+00  4.17941473e-02  3.65021378e-01 -5.13857543e-01\n",
      " -1.23142898e-01 -3.33116651e-01  1.00980029e-01 -5.89857996e-01\n",
      " -9.48906317e-02 -9.19060186e-02  2.68445052e-02  2.77156562e-01\n",
      "  1.61942631e-01 -9.79200900e-01  4.70811307e-01 -2.12517321e-01\n",
      " -7.79794604e-02 -8.91188607e-02 -5.09576797e-01  3.48175466e-02\n",
      " -8.71438608e-02 -1.66360028e-02 -6.81157291e-01 -3.56875658e-01\n",
      " -5.22669137e-01 -1.04256904e+00  4.38744187e-01 -9.59213853e-01\n",
      " -6.62884653e-01  8.37721586e-01 -6.78868532e-01 -2.26250857e-01\n",
      "  4.03876603e-01  1.11311771e-01  7.48270631e-01  3.97616893e-01\n",
      " -5.13484657e-01 -7.13875294e-02  7.52224684e-01  4.91683096e-01\n",
      " -3.48495483e-01  6.56316996e-01 -3.58621106e-02 -7.64509737e-01\n",
      " -1.06428349e+00 -7.15955615e-01  3.05139482e-01 -4.76697475e-01\n",
      " -4.39959228e-01  4.23235595e-01  8.68571177e-02 -9.71870497e-02\n",
      "  1.95307046e-01  1.49537891e-01 -6.09528840e-01 -5.92746377e-01\n",
      " -1.49414420e-01 -1.47682339e-01  2.55254745e-01 -1.34426355e-01\n",
      "  4.19785567e-02  1.15219261e-02 -1.82967708e-02  2.45804489e-01\n",
      "  4.63320225e-01  6.10241830e-01  2.58775622e-01 -1.52408585e-01\n",
      "  1.06998049e-01 -6.24313772e-01 -2.48203039e-01  1.93693176e-01\n",
      " -6.22648239e-01  1.13581681e+00  1.78169459e-01  8.18062127e-01\n",
      " -1.30686358e-01 -6.68864651e-03 -3.45848590e-01  1.30410651e-02\n",
      " -5.45876622e-01  3.93922418e-01  1.96994483e-01 -8.49271566e-02\n",
      "  4.12490815e-01  3.21647227e-01 -1.34228334e-01 -5.21908402e-01\n",
      "  7.68698305e-02  2.89675921e-01 -2.14428067e-01  8.11808854e-02\n",
      " -3.45671117e-01 -1.07822210e-01  5.28656423e-01 -4.61703897e-01\n",
      "  2.12907910e-01  2.95020163e-01  2.42747873e-01  8.37996423e-01\n",
      " -2.72936076e-01 -9.35190976e-01  2.04707533e-01  5.89354515e-01\n",
      " -5.84326029e-01 -1.02056050e+00  7.69788325e-01 -5.45174241e-01\n",
      " -4.67897296e-01  3.55541676e-01  3.18951577e-01  3.60033482e-01\n",
      " -4.71729450e-02  5.83665550e-01 -2.94667184e-01  6.60664916e-01\n",
      "  1.47198826e-01  4.17423129e-01  4.92420048e-01 -1.02075316e-01\n",
      " -7.93873891e-02 -7.84650922e-01 -5.82694292e-01  4.99285758e-02\n",
      " -1.00461531e+00 -1.42997488e-01 -5.77652991e-01  5.43944836e-01\n",
      "  4.42959547e-01 -1.29006654e-01 -3.80392194e-01  3.43606144e-01\n",
      "  4.27765191e-01 -5.13216972e-01 -1.12792909e+00 -7.27411091e-01\n",
      "  3.95747423e-01  3.66038680e-01 -6.41389489e-01  1.02397695e-01\n",
      " -4.01408672e-01  3.94640535e-01 -4.83664960e-01  3.67854029e-01\n",
      " -2.47852892e-01  5.53885996e-01  6.69999793e-02  1.60064518e-01\n",
      " -1.05906129e+00  7.01747537e-01 -2.13338122e-01  9.92709458e-01\n",
      " -5.38657367e-01  1.14064336e+00  6.82174623e-01 -1.64134070e-01\n",
      " -1.40684471e-02  7.79499888e-01 -4.72897738e-01  3.26121598e-01\n",
      "  4.32277620e-01 -9.38179433e-01  2.84063727e-01 -7.65955806e-01\n",
      " -3.28338981e-01 -5.87768018e-01 -4.12772745e-01  2.23351151e-01\n",
      " -7.78657973e-01  2.62937844e-01  3.85495037e-01 -6.12316579e-02\n",
      " -1.01322114e+00  2.81209320e-01  5.07189691e-01  4.36391652e-01\n",
      "  1.88438222e-01 -1.96345299e-01  2.80614316e-01 -6.98799014e-01\n",
      " -5.39249957e-01 -1.06527768e-01  1.44188970e-01 -4.40513432e-01]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "tensor_data = torch.normal(0, 0.5, size=(1, 1000))\n",
    "data_x = np.linspace(-1, 1, 1000)\n",
    "data_y = tensor_data.numpy().astype(\"float32\")\n",
    "print(tensor_data)\n",
    "print(data_y[0])\n",
    "plt.plot(data_x, data_y[0])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 14.torch.eq(input, other)\n",
    "**比较元素是否相等**\n",
    "# 14.1.torch.equal(tensor1, tensor2, out=None)\n",
    "**比较两个张量是否相等，包含元素和形状**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ True, False],\n",
      "        [False,  True],\n",
      "        [False, False]])\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "x = torch.Tensor([[1,2],[3,4],[5,5]])\n",
    "y = torch.Tensor([[1,3],[2,4],[4,3]])\n",
    "print(torch.eq(x, y))\n",
    "print(torch.equal(x, y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 15.torch.mean(input, dim keepdim=False)\n",
    "**当keepdim=True时，输入的维度若为2，求完mean之后维度仍然是2**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[1., 2., 3.],\n",
      "        [4., 5., 6.]], dtype=torch.float64)\n"
     ]
    }
   ],
   "source": [
    "A = np.arange(1, 7, dtype=float)\n",
    "\n",
    "a = torch.from_numpy(A).view(2,3)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.mean(a): tensor(3.5000, dtype=torch.float64)\n",
      "====================万能的分隔符====================\n",
      "torch.mean(a,0): tensor([2.5000, 3.5000, 4.5000], dtype=torch.float64)\n",
      "torch.Size([3])\n",
      "====================万能的分隔符====================\n",
      "torch.mean(a,1) tensor([2., 5.], dtype=torch.float64)\n"
     ]
    }
   ],
   "source": [
    "print(\"torch.mean(a):\",torch.mean(a))\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "print(\"torch.mean(a,0):\",torch.mean(a,0))\n",
    "print(torch.mean(a,0).shape)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "print(\"torch.mean(a,1)\",torch.mean(a,1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### keepdim=True时，输出的维度等于原张量的维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.mean(a,0, True):\n",
      " tensor([[2.5000, 3.5000, 4.5000]], dtype=torch.float64)\n",
      "torch.Size([1, 3])\n"
     ]
    }
   ],
   "source": [
    "b = torch.mean(a, 0, True)\n",
    "print(\"torch.mean(a,0, True):\\n\",b)\n",
    "print(b.shape)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
